package com.xzmzhp.config;

import com.xzmzhp.constant.ReturnConstant;
import com.xzmzhp.utils.return_tool.ReturnData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.SQLException;
import java.text.ParseException;

/**
 * @author: 王源(xm)
 * @create: 2021-09-19 22:15
 * @program: ams
 * @description: 全局异常处理类
 */
@Slf4j
@ControllerAdvice
public class AmsExceptionHandler {

    /**
     * 类型强制转换异常
     *
     * @param e 类型强制转换异常
     * @return 错误信息
     */
    @ExceptionHandler(ClassCastException.class)
    @ResponseBody
    public ReturnData exception(ClassCastException e) {
        log.info("类型强制转换异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "类型强制转换异常");
    }

    /**
     * 空指针异常
     *
     * @param e 空指针异常
     * @return 错误信息
     */
    @ExceptionHandler(NullPointerException.class)
    @ResponseBody
    public ReturnData exception(NullPointerException e) {
        log.info("空指针异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "空指针异常");
    }

    /**
     * 数组下标越界异常
     *
     * @param e 数组下标越界异常
     * @return 错误信息
     */
    @ExceptionHandler(ArrayIndexOutOfBoundsException.class)
    @ResponseBody
    public ReturnData exception(ArrayIndexOutOfBoundsException e) {
        log.info("数组下标越界异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "数组下标越界异常");
    }

    /**
     * 文件未找到异常
     *
     * @param e 文件未找到异常
     * @return 错误信息
     */
    @ExceptionHandler(FileNotFoundException.class)
    @ResponseBody
    public ReturnData exception(FileNotFoundException e) {
        log.info("文件未找到异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "未找到相应文件");
    }

    /**
     * 字符串转换为数字异常
     *
     * @param e 字符串转换为数字异常
     * @return 错误信息
     */
    @ExceptionHandler(NumberFormatException.class)
    @ResponseBody
    public ReturnData exception(NumberFormatException e) {
        log.info("字符串转换为数字异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "字符串转换为数字异常");
    }

    /**
     * 操作数据库异常
     *
     * @param e 操作数据库异常
     * @return 错误信息
     */
    @ExceptionHandler(SQLException.class)
    @ResponseBody
    public ReturnData exception(SQLException e) {
        log.info("操作数据库异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "操作数据库异常");
    }

    /**
     * 输入输出异常
     *
     * @param e 输入输出异常
     * @return 错误信息
     */
    @ExceptionHandler(IOException.class)
    @ResponseBody
    public ReturnData exception(IOException e) {
        log.info("输入输出异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "输入输出异常");
    }

    /**
     * 方法未找到异常
     *
     * @param e 方法未找到异常
     * @return 错误信息
     */
    @ExceptionHandler(NoSuchMethodException.class)
    @ResponseBody
    public ReturnData exception(NoSuchMethodException e) {
        log.info("方法未找到异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "方法未找到异常");
    }

    /**
     * 语法分析异常
     *
     * @param e 语法分析异常
     * @return 错误信息
     */
    @ExceptionHandler(ParseException.class)
    @ResponseBody
    public ReturnData exception(ParseException e) {
        log.info("日期时间字符串值和格式无效");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "日期时间字符串值和格式无效");
    }

    /**
     * 克隆异常
     *
     * @param e 克隆异常
     * @return 错误信息
     */
    @ExceptionHandler(CloneNotSupportedException.class)
    @ResponseBody
    public ReturnData exception(CloneNotSupportedException e) {
        log.info("克隆异常");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "克隆异常");
    }

    /**
     * 克隆异常
     *
     * @param e 克隆异常
     * @return 错误信息
     */
    @ExceptionHandler(AccessDeniedException.class)
    @ResponseBody
    public ReturnData exception(AccessDeniedException e) {
        log.info("当前访问没有权限");
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "当前访问没有权限");
    }

    /**
     * 总异常处理
     *
     * @param e 所有异常
     * @return 错误信息 错误信息
     */
    @ExceptionHandler(value = Exception.class)
    public ReturnData exceptionHandler(Exception e) {
        e.printStackTrace();
        return ReturnData.error(ReturnConstant.FAIL, "请求失败");
    }
}
